package linyunshi.rbac.service.array;

import linyunshi.rbac.domain.dto.UserDto;
import linyunshi.rbac.domain.entity.Dept;
import linyunshi.rbac.domain.entity.Role;
import linyunshi.rbac.domain.entity.User;
import linyunshi.rbac.domain.vo.DeptVo;
import linyunshi.rbac.domain.vo.Result;
import linyunshi.rbac.domain.vo.UserVo;
import linyunshi.rbac.service.IDeptService;
import linyunshi.rbac.service.IRoleService;
import linyunshi.rbac.service.IUserService;


/**
 * 业务层-用户
 *
 * @author linyunshi
 * @since 2025/6/7 15:11
 */
public class UserService extends BaseService<User,UserDto,UserVo> implements IUserService {

    /**
     *将类方法调用转换为实例方法调用
     */
    //final：将两个属性定义成终态。因为只赋值一次，后续不会再修改该值。
    //private：仅在这个类的内部使用。
    private final IDeptService deptService;
    private final IRoleService roleService;

    private static IUserService singleton;

    //对上面两个属性进行初始化
    private UserService() {
        deptService = DeptService.getInstance();
        roleService = RoleService.getInstance();
        data = new User[DATA_SIZE + 1];
        temp = new UserVo[DATA_SIZE];
    }

    public static IUserService getInstance() {
        if( singleton == null ) {
            singleton = new UserService();
        }
        return singleton;
    }


    @Override
    UserVo convertToVo(User user) {
        String deptName = "";
        Dept dept = deptService.findById(user.deptId);
        if(dept != null){
            deptName = dept.name;
        }

        String roleName = "";
        Role role = roleService.findById(user.roleId);
        if(role != null){
            roleName = role.name;
        }

        return new UserVo(user.getId(),user.username,user.name,user.mobile,user.email,user.deptId,deptName,
                user.roleId,roleName, user.enabled);
    }

    @Override
    User createEntity(UserDto dto, int id) {
        return new User(id,dto.username, dto.name, dto.mobile, dto.email, dto.deptId, dto.roleId);
    }

    @Override
    void updateEntity(UserDto dto, User user) {
        user.username = dto.username;
        user.name = dto.name;
        user.mobile = dto.mobile;
        user.email = dto.email;
        user.deptId = dto.deptId;
        user.roleId = dto.roleId;
    }

    /**
     * 判断该部门是否被使用
     */
    @Override
    public boolean deptInUse(int deptId) {
        boolean inUse = false;
        for(User user: data) {
            if(user!=null && user.deptId==deptId) {
                inUse = true;//表明该部门还在被使用
                break;//跳出for循环
            }
        }
        return inUse;
    }

    /**
     * 判断该角色是否被使用
     */
    @Override
    public boolean roleInUse(int roleId) {
        boolean inUse = false;
        for(User user: data) {
            if(user!=null && user.roleId==roleId) {
                inUse = true;//表明该角色还在被使用
                break;//跳出for循环
            }
        }
        return inUse;
    }

    @Override
    public Result create(UserDto dto) {

        //检测部门id是否符合标准。（调用部门业务层）
        if (!deptService.existsById(dto.deptId)) {
            return Result.failure("创建失败，不存在指定部门");
        }
        //检测角色id。（调用角色业务层）
        if (!roleService.existsById(dto.roleId)) {
            return Result.failure("创建失败，不存在指定角色");
        }

        return super.create(dto);
    }

    @Override
    public Result update(UserDto dto,int id) {
        //检测部门id是否符合标准。（调用部门业务层）
        if (!deptService.existsById(dto.deptId)) {
            return Result.failure("创建失败，不存在指定部门");
        }
        //检测角色id。（调用角色业务层）
        if (!roleService.existsById(dto.roleId)) {
            return Result.failure("创建失败，不存在指定角色");
        }
       return super.update(dto,id);
    }

    /**
     * 切换状态
     */
    @Override
    public Result toggle(int id) {
        if(!existsById(id)) {
            return Result.failure("切换状态失败，不存在该数据");
        }
        data[id].enabled = !data[id].enabled;
        return Result.success(data[id].enabled ?"启用成功":"停用成功",null);
    }
}
